/*
* 物料分类模块
*/
const express = require('express');
const router = express.Router();
// 引入数据库
const db = require("../../../config/db");
// 引入时间包
const moment = require("moment");
// 引入方法库
const { toCamelCase, toUnderlineCase, verifyToken, recursionGenerateTree} = require("../../../config/utils");
// 引入日志
const log = require("../../log");

// 新增物料产品分类表
router.post('/', (req, res) => {
    console.log("===========新增物料产品分类表接口============");
    // 获取token的创建人
    let {username} = verifyToken(req.headers.authorization);
    // 获取参数
    let {enable_flag, item_or_product, item_type_name, order_num, parent_type_id, item_type_id} = toUnderlineCase(req.body);
    // 获取创建时间
    let create_time = moment().format("YYYY-MM-DD HH:mm:ss");
    if(!item_or_product){
        res.send({code: 500, msg: '请指定是物料分类还是产品分类'})
        return
    }
    // 查询同级别名称是否重复
    db.query("查询同级别名称是否重复", `select * from md_item_type where item_type_name = '${item_type_name}' and parent_type_id ='${parent_type_id}'`, (err, result) => {
        if (err) {
            res.send({code: 500, msg: '查询同级别名称是否重复失败'})
            return
        }
        if(result.length > 0) {
            res.send({code: 500, msg: `当前同级别分类名称-${item_type_name}-重复`})
            return
        }

         // 查询数据库有几条数据生成id 联合查询 查询父类层级
        let sql_union = `select count(*) from md_item_type union all SELECT ancestors from md_item_type where item_type_id = ${parent_type_id}`
        db.query("查询数据库有几条数据生成id  联合查询 查询父类层级", sql_union, (err, result) => {
            if (err) {
                res.send({
                    msg: "查询数据库有几条数据生成id失败", 
                    code: 500
                })
                return
            }
            // 生成id
            let item_type_id = Number(result[0]['count(*)']) + 200;
            // 生成id的code：ITEM_TYPE_0000
            let item_type_code = `ITEM_TYPE_${item_type_id < 1000 ? "0"+ item_type_id : item_type_id}`;
            // 父类层级
            let ancestors = result[1]['count(*)'] ? result[1]['count(*)'] + ',' + parent_type_id : result[1]['count(*)'];
            // 生成sql
            let sql = `insert into md_item_type (item_type_id, item_type_code, enable_flag, item_or_product, item_type_name, order_num, parent_type_id, create_time, create_by, ancestors)
            values ('${item_type_id}', '${item_type_code}', '${enable_flag}', '${item_or_product}', '${item_type_name}', '${order_num}', '${parent_type_id}', '${create_time}', '${username}' ,'${ancestors}')`;
            // 查询数据库
            db.query("新增物料产品分类表", sql, (err, result) => {
                if (err) {
                    res.send({
                        msg: "新增物料产品分类表失败", 
                        code: 500
                    })
                    return
                }
                if(result.affectedRows > 0) {
                    res.send({code:200, msg: '新增成功',data:1})
                }else{
                    res.send({code:500, msg: '新增失败',data:0})
                }
            })
        })
    })
   
})

// 查询物料产品分类表
router.get('/list', (req, res) => {
    console.log("===========查询物料产品分类表接口============");
    // 获取参数
    let {itemTypeName, enableFlag} = req.query;
    let sql = "select * from md_item_type";
    // 判断参数是否为空
    if(itemTypeName) {
        sql += ` where item_type_name like '%${itemTypeName}%'`
    }
    if(enableFlag) {
        sql += ` ${itemTypeName ? "and" : "where"} enable_flag = '${enableFlag}'`
    }
    // 查询数据库
    db.query("查询物料产品分类表", sql, (err, result) => {
        if (err) {
            res.send({
                code: 500,
                msg: '查询物料产品分类表失败'
            })
            return
        }
        if(result.length > 0) {
            // 变量Json数组key转成下划线第一个大写
            result = result.map(item => {
                return toCamelCase(item)
            })
        }
        res.send({
            code: 200,
            msg: '查询成功',
            data: result
        })
    })
    
})

// 查询单个物料产品分类表
router.get(/^\/(\d+)$/, (req, res) => {
    console.log("===========查询单个物料产品分类表接口，正则匹配============");
    let url_arr = req.url.split("/");
    const item_type_id = url_arr[url_arr.length - 1];
    // 查询数据库
    db.query("查询单个物料产品分类表", `select * from md_item_type where item_type_id = '${item_type_id}'`, (err, result) => {
        if (err) {
            res.send({code: 500, msg: '查询单个物料产品分类表失败'})
            return
        }
        if(result.length > 0) {
           // 变量Json数组key转成下划线第一个大写
            result = result.map(item => {
                item.params = {};
                item.children = [];
                return toCamelCase(item)
            })
            result = result[0]
        }
        res.send({
            code: 200,
            msg: '查询成功',
            data: result
        })
    })
    
})

// 查询部门列表（排除节点) -- 暂时不知道这个接口是干嘛的
router.get('/list/exclude/:item_type_id', (req, res) => {
    console.log("===========查询部门列表（排除节点）接口============");
    // 获取参数
    let {item_type_id} = req.params;
    // 查询数据库
    db.query("查询部门列表（排除节点）", `select * from md_item_type`, (err, result) => {
        if (err) {
            res.send({code: 500, msg: '查询部门列表（排除节点）失败'})
            return
        }
        if(result.length > 0) {
           // 变量Json数组key转成下划线第一个大写
            result = result.map(item => {
                item.params = {};
                item.children = [];
                item.searchValue = null;
                return toCamelCase(item)
            })
        }
        res.send({
            code: 200,
            msg: '查询成功',
            data: result
        })
    })
})

// 修改物料产品分类表
router.put('/', (req, res) => {
    console.log("===========修改物料产品分类表接口============");
    // 判断有没有权限(只判断账号admin，和后续优化)
    let {username} = verifyToken(req.headers.authorization)
    if(username != 'admin') {
        res.send({code: 400, msg: '没有权限，请联系管理员授权'})
        return
    }
    // 获取参数
    let {item_type_name, order_num, enable_flag, item_or_product,item_type_id, parent_type_id} = toUnderlineCase(req.body);
    // 更新时间
    let update_time = moment().format('YYYY-MM-DD HH:mm:ss');
    // 查询同级别名称是否重复
    db.query("查询同级别名称是否重复", `select * from md_item_type where item_type_name = '${item_type_name}' and item_type_id != ${item_type_id} and parent_type_id ='${parent_type_id}'`, (err, result) => {
        if (err) {
            res.send({code: 500, msg: '查询同级别名称是否重复失败'})
            return
        }
        if(result.length > 0) {
            res.send({code: 500, msg: `当前同级别分类名称-${item_type_name}-重复`})
            return
        }
        
        // 更新数据库
        db.query("修改物料产品分类表", `update md_item_type set item_type_name = '${item_type_name}', 
        order_num = '${order_num}', enable_flag = '${enable_flag}', item_or_product = '${item_or_product}', 
        update_time = '${update_time}', update_by = '${username}' where item_type_id = '${item_type_id}'`, (err, result) => {
            if (err) {
                res.send({code: 500, msg: '修改物料产品分类表失败'})
                return
            }
            if(result.affectedRows > 0) {
                res.send({
                    code: 200,
                    msg: '修改成功',
                    data: result
                })
            } else {
                res.send({
                    code: 500,
                    msg: '修改失败'
                })
            }
        })
    })

})

// 删除物料产品分类表
router.delete('/:item_type_id', (req, res) => {
    console.log("===========删除物料产品分类表接口============");
    // 判断有没有权限(只判断账号admin，和后续优化)
    let {username} = verifyToken(req.headers.authorization)
    if(username != 'admin') {
        res.send({code: 400, msg: '没有权限，请联系管理员授权'})
        return
    }
    // 获取参数
    let {item_type_id} = req.params;
    // 查询是否存在子分类
    db.query("查询是否存在子分类", `select * from md_item_type where ancestors like '%${item_type_id}%'`, (err, result) => {
        if (err) {
            res.send({code: 500, msg: '查询是否存在子分类失败'})
            return
        }
        if(result.length > 0) {
            res.send({code: 500, msg: '存在子分类，无法删除，请先删除子分类'})
            return
        }
        // 删除数据库
        db.query("删除物料产品分类表", `delete from md_item_type where item_type_id = '${item_type_id}'`, (err, result) => {
            if (err) {
                res.send({code: 500, msg: '删除物料产品分类表失败'})
                return
            }
            if(result.affectedRows > 0) {
                res.send({ code: 200,msg: '删除成功', data: result })
            }else {
                res.send({ code: 500, msg: '删除失败' })
            }
        })
    })
})
    

// 查询物料下拉树结构接口
router.get('/treeselect', (req, res) => {
    console.log("===========查询物料下拉树结构接口============");
    // 查询数据库
    db.query("查询物料下拉树结构接口", `select item_type_id as id, item_type_name as label, parent_type_id as pid  from md_item_type`, (err, result) => {
        if (err) { 
            res.send({code: 500, msg: '查询物料下拉树结构接口失败'}) 
            return
        }
        if(result.length > 0) {
            // 生成树结构递归
            result = recursionGenerateTree(0, result)
        }
        res.send({
            code: 200,
            msg: '测试数据',
            data: result,
        })
    })
   
})

module.exports = router;